package abstractfactory

import "fmt"

// 抽象工厂模式用于生产产品族的工厂 所生成的对象是相关的
// 如果抽象工厂退化成生成的对象 无关联则为工厂函数模式
// 比如本例子中使用RDB和xml存储订单信息 抽象工厂分布能生成相关的订单信息和订单详情信息
// 如果业务逻辑中需要替换使用的时候只需要改动工厂函数相关的类型就能替换使用不同的存储方式了
//OrderMainDAO 为订单主记录
type OrderMainDAO interface {
	SaveOrderMain()
}

//ordeDetailDAO 为订单详情记录
type OrderDetailDAO interface {
	SaveOrderDetail()
}

//DAOFactory DAO 抽象模式的工厂接口
type DAOFactory interface {
	CreateOrderMainDAO() OrderMainDAO     //嵌套子接口 创建订单-主要数据对象
	CreateOrderDetailDAO() OrderDetailDAO //创建订单-详情数据对象
}

// RDBMainDAO 为关系型数据库OrderMainDAO 实现
type RDBMainDAO struct{}

func (*RDBMainDAO) SaveOrderMain() {
	fmt.Print("rdb main save\n")
}

//RDBDetailDAO 为关系型数据库的OrderDetailDAO实现
type RDBDetailDAO struct{}

// SaveOrderDetail ...
func (*RDBDetailDAO) SaveOrderDetail() {
	fmt.Print("rdb detail save\n")
}

//RDBDAOFactory 是RDB 抽象工厂实现
type RDBDAOFactory struct{}

func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {
	return &RDBMainDAO{}
}
func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
	return &RDBDetailDAO{}
}

//XMLMainDAO XML存储
type XMLMainDAO struct{}

//SaveOrderMain ...
func (*XMLMainDAO) SaveOrderMain() {
	fmt.Print("xml main save\n")
}

//XMLDetailDAO XML存储
type XMLDetailDAO struct{}

// SaveOrderDetail ...
func (*XMLDetailDAO) SaveOrderDetail() {
	fmt.Print("xml detail save")
}

//XMLDAOFactory 是RDB 抽象工厂实现
type XMLDAOFactory struct{}

func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {
	return &XMLMainDAO{}
}

func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
	return &XMLDetailDAO{}
}

//RDBMainDAP
type Reponse struct {
	Code string      `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}
